home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / PET / S-Super PET / (s)tk.d64 / UDUMP.ASM < prev    next >
Assembly Source File  |  2009-01-18  |  6KB  |  156 lines

  1. ; u.asm - A universal dump to disk, printer, serial, or ieee4. No LF with CR.
  2. ; Gary L. Ratliff's screen dump routine, using Jeff Larson's print routine,
  3. ; as modified by Terry M. Peterson, and modified some more by Gary Ratliff,
  4. ; to also work as a screen-disk dump, and as modified some more by Dick Barnes
  5. ; to be a universal dump to disk, ieee4, printer, or serial. Then modified by
  6. ; Delton P. Richardson to print reverse field char. as normal characters on
  7. ; dot-matrix printers. There's a lot of blood on this one....
  8.  
  9. ; To use : Press shifted-7 key on keypad (PF 7), then touch:
  10. ;    i  for dump to IEEE4
  11. ;    p  for dump to PRINTER       No RETURN is required. The character is 'got'.
  12. ;    d  for dump to DISK          Any wrong key causes default to PRINTER
  13. ;    s  for dump to SERIAL
  14. ; Action : Prints CRT from line 1 THROUGH line cursor is on at start.
  15. ; Be SURE to put a file named: file%n on drive 0 for dumps to disk; all material
  16. ; is appended to that file.
  17.  
  18.       xref curpos_, memend_, conbint_, printf_, openf_, kyputb_
  19.       xref closef_, fputchar_, fputnl_, initstd_, intvctr_, kyindx_, kyptr1_
  20.       xref kyptr2_, file_, usirq_, printer_, serial_, write_, append_
  21.  
  22. main    equ   *
  23.         jsr   initstd_     ; Crash at monitor breakpoints if this is left out.
  24.         ldd   #main
  25.         std   memend_
  26.         clr   $32          ; Service_ at $32 set zero returns to menu.
  27.         clr   busy
  28.         ldd   #instr       ; Give the instructions on how to use this at
  29.         jsr   printf_      ; loading; thereafter, no prompts.
  30.         ldx   #8
  31.         ldd   intvctr_,x
  32.         std   resvd
  33.         pshs  x
  34.         ldd   #start
  35.         jsr   conbint_
  36.         puls  d
  37.         rts
  38. start   equ   *
  39.         jsr   [resvd]
  40.         ldb   kyindx_
  41.         cmpb  #$95           ; Shift keypad 7 with offset.
  42.         lbne  done           ; Quit if it isn't down.
  43.         tst   busy
  44.         if eq
  45.           dec   busy
  46.           ldd   #margin      ; Cursor set to left margin to avoid printing
  47.           jsr   printf_      ; next line.
  48.           ldd   curpos_
  49.           addd  #80          ; Adjust cursor value to print line cursor
  50.           std   where        ; is on--including line 25.
  51.           ldd   kyptr2_
  52.           std   kyptr1_
  53.           bsr   getit        ; Go get the input on type dump wanted.
  54.           ldb   #'d          ; Dump to disk?
  55.           guess
  56.             cmpb  type
  57.             quif  ne
  58.             ldd   #append_   ; Yeah, dump to disk, so open for append.
  59.             pshs  d
  60.             ldd   #file_
  61.           admit
  62.             ldd   #write_    ; Get write mode for all other options.
  63.             pshs  d          ; If you don't want this program to default
  64.             ldb   #'i        ; to a Commodore printer, change the
  65.             cmpb  type       ; ldb characters from here on, and let the
  66.             quif  ne         ; dump default to the one you don't list.
  67.             ldd   #ieee
  68.           admit
  69.             ldb   #'s        ; s is serial, i is ieee4, p is Commodore;
  70.             cmpb  type       ; since p isn't listed, that is default.
  71.             quif  ne         ; If any wrong character is entered, you still
  72.             ldd   #serial_   ; get default to 'printer'
  73.           admit
  74.             ldd   #printer_
  75.           endguess
  76.           jsr   openf_
  77.           std   outpt        ; Store file control block returned by openf_
  78.           puls  d            ; Recover from 'write'/'append' push.
  79.           if ne
  80.             ldx #1           ; Start with screen position 1.
  81.             loop
  82.               ldb  kyindx_
  83.               cmpb #4
  84.               quif eq
  85.               pshs x
  86.               bsr  print     ; Go print line.
  87.               puls x
  88.               leax 80,x      ; Increment x by 80 char for one line.
  89.               cmpx where     ; Compare x to where cursor was at start.
  90.             until hs         ; If 'higher' or 'same', quit loop.
  91.             ldd outpt        ; Load file control block,
  92.             jsr closef_      ; and close the file.
  93.           endif
  94.           clr  busy
  95.         endif
  96.         ldy   #$130        ; Start of keyboard buffer.
  97.         loop               ; Characters w/out CR 'leak' to screen...and enter
  98.           clr   ,y+        ; false monitor cmds, so clear  buffer to the
  99.           cmpy  #$158      ; end, at $157.
  100.         until eq
  101. done    rts
  102.  
  103. margin  fcb 11,13,0          ; Sets cursor to left margin.
  104.  
  105. where   rmb 2                ; Stores original cursor position + 80
  106.  
  107. getit   loop
  108.           jsr   kyputb_      ; Get response--no RETURN.
  109.           cmpb  #0           ; Look for more than null.
  110.         until ne
  111.         stb   type
  112.         cmpb  #$7b           ; PF7 will kick off dump to 'printer' if hit again.
  113.         if pl                ; So refuse any character larger than 'z';
  114.           jmp getit          ; jump back for valid character.
  115.         endif
  116.         rts
  117.  
  118. print   lda   #79
  119.         leax  $7fff,x      ; $8000 is start of screen (x has 1 in it
  120.         loop               ; at the start).
  121.           ldb a,x          ; Start with a=79 + x=$8000, or end line.
  122.           cmpb #'          ; and compare that position with a null.
  123.           quif ne          ; If a char, stop; if null, keep going.
  124.           deca             ; And keep looking until you find a character....
  125.         until mi           ; until the minus report by neg flag (no char at all)
  126.         cmpb  #'           ; Need comparison for next line--
  127.         if ne              ; If NOT zero (may be negative for reverse field),
  128.           loop
  129.             ldb ,x+        ; Back up and get character.
  130.             cmpb #$a0      ; Check for reverse field.
  131.             blo  norm      ; If value lower than dec 160, branch to reg. char.
  132.             subb #$80      ; If not, convert to normal char.
  133. norm        pshs d,x       ; Save registers--
  134.             ldd outpt      ; get the file control block
  135.             jsr fputchar_  ; and print the character
  136.             puls d,x
  137.             deca           ; decrement by one character, which we printed
  138.           until mi         ; and keep printing until DEC reports line done.
  139.         endif
  140.         ldd outpt          ; Get the file control block,
  141.         jmp fputnl_        ; and put new line to file.
  142.  
  143. outpt   rmb 2
  144. resvd   rmb 2
  145. busy    rmb 2
  146. type    rmb 1
  147.  
  148. ieee    fcc "ieee4"
  149.         fcb 0
  150.  
  151. instr fcb  12
  152.       fcc "UDUMP loaded. To use: press PF7, then one of keys below.%n%n"
  153.       fcc "To disk: 'd'| to ieee4: 'i'| to printer: 'p'| to serial: 's'%n%n"
  154.       fcb 0
  155.       end
  156.